﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Insifo.BE;
using Insifo.BE.Gen;
using Insifo.DL.Gen;
using Insifo.BL.Gen;
using Insifo.DL;

namespace Insifo.BL.Gen
{

    public class BLEmpleado
    {
        //Objeto transaccion
        DLTransactionMng _transaccion = null;
        DLEmpleado _dlEmpleado = new DLEmpleado();
        DLPersona _dlPersona = new DLPersona();

        /// <summary>
        /// Método extrae Companias por Usuario
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>

        public DataSet Listar(BEEmpleado pbe)
        {
            return _dlEmpleado.Listar(pbe);
        }

        /// <summary>
        /// Método extrae Companias por Usuario
        /// </summary>
        /// <returns>Devuelve un DataSet</returns>

        public DataSet Listar_Sel(BEEmpleado pbe)
        {
            return _dlEmpleado.Listar_Sel(pbe);
        }

        /// <summary>
        /// Método que obtiene un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEEmpleado Obtener(BEEmpleado pbe)
        {
            return _dlEmpleado.Obtener(pbe);
        }

        /// <summary>
        /// Método que inserta un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEEmpleado Insertar(BEEmpleado pbe)
        {
            string strLocalDireccion = string.Empty, strLocalDireccionReferencia = string.Empty;
            int nLocalIdPais = 0, nLocalIdDepartamento = 0, nLocalIdProvincia = 0;
            string strLocalTelefono = String.Empty, strLocalCelular = string.Empty, strLocalFax = string.Empty;

            int nNacimientoIdPais = 0, nNacimientoIdDepartamento = 0, nNacimientoIdProvincia = 0;
            string strLugarNacimiento = string.Empty;

            string strExtranjeroTelefono = String.Empty, strExtranjeroCelular = String.Empty, strExtranjeroDireccion = String.Empty;
            int nExtranjeroIdPais = 0, nExtranjeroIdDepartamento = 0, nExtranjeroProvincia = 0;
            

            BEEmpleado oBe = new BEEmpleado();
            DLDireccion _DLDireccion = new DLDireccion();

            try
            {
                //BEPersona oBePersona = new BEPersona();                
                //Se crea una persona desde el formulario de empleado.

                _transaccion = DLTransactionMng.Begin();
                _dlEmpleado.Transaction = _transaccion;
                _dlPersona.Transaction = _transaccion;
                _DLDireccion.Transaction = _transaccion;

                //>Insertar Persona en Galexito       
                pbe.Persona.IdBanco = pbe.IdBanco;
                pbe.Persona.TipoCuenta = pbe.TipoCuenta;
                pbe.Persona.NumeroCuenta = pbe.NumeroCuenta;
                var beRe = _dlPersona.Insertar(pbe.Persona);

                if (beRe.IdPersona > 0)
                {
                    if (pbe.Direccion != null)
                    {
                        //Insertar Direccion Cliente en Galexito
                        foreach (BEDireccion be in pbe.Direccion)
                        {
                            switch (be.TipoDireccion)
                            {
                                case "L": //Domicilio Local
                                    nLocalIdPais = be.IdPais;
                                    nLocalIdDepartamento = be.IdDepartamento;
                                    nLocalIdProvincia = be.IdProvincia;
                                    strLocalDireccion = be.Direccion;
                                    strLocalDireccionReferencia = be.Referencia;
                                    strLocalTelefono = be.Telefono1;
                                    strLocalCelular = be.Telefono3;
                                    strLocalFax = be.Fax;
                                    break;
                                case "N": //Nacimiento
                                    nNacimientoIdPais = be.IdPais;
                                    nNacimientoIdDepartamento = be.IdDepartamento;
                                    nNacimientoIdProvincia = be.IdProvincia;
                                    strLugarNacimiento = be.Direccion;
                                    break;
                                case "E"://Domicilio Extranjero
                                    nExtranjeroIdPais = be.IdPais;
                                    nExtranjeroIdDepartamento = be.IdDepartamento;
                                    nExtranjeroProvincia = be.IdProvincia;
                                    strExtranjeroTelefono = be.Telefono1;
                                    strExtranjeroCelular = be.Telefono3;
                                    strExtranjeroDireccion = be.Direccion;
                                    break;
                                default:
                                    break;
                            }
                            be.IdPersona = beRe.IdPersona;
                            _DLDireccion.Insertar(be);
                        }
                    }
                    if (beRe.TransaccionSpring == "S")
                    {
                        //Insertar PersonaMast en Spring  
                        pbe.Persona.IdPersona = beRe.IdPersona;

                        pbe.Persona.DescripcionDireccion = strLocalDireccion;
                        pbe.Persona.DireccionReferencia = strLocalDireccionReferencia;
                        pbe.Persona.IdDepartamento = nLocalIdDepartamento;
                        pbe.Persona.IdProvincia = nLocalIdProvincia;
                        pbe.Persona.Telefono1 = strLocalTelefono;
                        pbe.Persona.Celular1 = strLocalCelular;
                        pbe.Persona.Fax = strLocalFax;

                        pbe.Persona.IdPaisNacimiento = nNacimientoIdPais;
                        pbe.Persona.IdDepartamentoNacimiento = nNacimientoIdDepartamento;
                        pbe.Persona.IdProvinciaNacimiento = nNacimientoIdProvincia;
                        pbe.Persona.LugarNacimiento = strLugarNacimiento;

                        pbe.Persona.IdPaisExtranjero = nExtranjeroIdPais;
                        pbe.Persona.IdDepartamentoExtranjera = nExtranjeroIdDepartamento;
                        pbe.Persona.IdProvinciaNacimiento = nExtranjeroProvincia;
                        pbe.Persona.DireccionExtranjero = strExtranjeroDireccion;
                        pbe.Persona.TelefonoExtranjero = strExtranjeroTelefono;
                        pbe.Persona.CelularExtranjero = strExtranjeroCelular;

                        _dlPersona.InsertarSpring(pbe.Persona);
                        _dlPersona.ActualizarUnidadReplicacionSpring(pbe.Persona);
                    }
                    //Asignar el IdPersona para la clase empleado

                    //Insertar Empleado en Galexito
                    pbe.IdEmpleado = beRe.IdPersona;
                    oBe = _dlEmpleado.Insertar(pbe);

                    if (oBe.TransaccionSpring == "S")
                    {
                        //>Insertar EmpleadoMast en Spring.
                        _dlEmpleado.InsertarSpring(pbe);
                        //Insertar HR_Empleado en Spring
                        _dlEmpleado.InsertarHREmpleadoSpring(pbe);
                        //Insertar HR_Sueldos  en Spring
                        _dlEmpleado.InsertarHRSueldosSpring(pbe);

                    }
                }
                else
                {
                    //Asignar el posible error
                    oBe.Error = beRe.Error;
                    oBe.Mensaje = beRe.Mensaje;
                }
                //Terminar la transaccion
                _transaccion.Commit();
            }
            catch (Exception e)
            {
                //Cancela la transaccion
                _transaccion.RollBack();
                throw e;
            }
            finally
            {
                _transaccion.Dispose();
            }
            return oBe;
        }

        /// <summary>
        /// Método que actualiza un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        //public BEEmpleado Actualizar(BEEmpleado pbe)
        //{
        //    return _dl.Actualizar(pbe);
        //}

        public BEEmpleado Actualizar(BEEmpleado pbe)
        {
            string strLocalDireccion = string.Empty, strLocalDireccionReferencia = string.Empty;
            int nLocalIdPais = 0, nLocalIdDepartamento = 0, nLocalIdProvincia = 0;
            string strLocalTelefono = String.Empty, strLocalCelular = string.Empty, strLocalFax = string.Empty;

            int nNacimientoIdPais = 0, nNacimientoIdDepartamento = 0, nNacimientoIdProvincia = 0;
            string strLugarNacimiento = string.Empty;

            string strExtranjeroTelefono = String.Empty, strExtranjeroCelular = String.Empty, strExtranjeroDireccion = String.Empty;
            int nExtranjeroIdPais = 0, nExtranjeroIdDepartamento = 0, nExtranjeroProvincia = 0;

            BEEmpleado beEmpleado = new BEEmpleado();
            _transaccion = DLTransactionMng.Begin();

            try
            {
                _dlEmpleado.Transaction = _transaccion;
                _dlPersona.Transaction = _transaccion;

                pbe.Persona.IdBanco = pbe.IdBanco;
                pbe.Persona.TipoCuenta = pbe.TipoCuenta;
                pbe.Persona.NumeroCuenta = pbe.NumeroCuenta;

                //Actualizar Persona en Galexito
                var beRe = _dlPersona.Actualizar(pbe.Persona);
                if (beRe.IdPersona > 0)
                {

                    if (pbe.Direccion != null)
                    {
                        //Insertar Direccion Cliente en Galexito
                        foreach (BEDireccion be in pbe.Direccion)
                        {
                            switch (be.TipoDireccion)
                            {
                                case "L": //Domicilio Local
                                    nLocalIdPais = be.IdPais;
                                    nLocalIdDepartamento = be.IdDepartamento;
                                    nLocalIdProvincia = be.IdProvincia;
                                    strLocalDireccion = be.Direccion;
                                    strLocalDireccionReferencia = be.Referencia;
                                    strLocalTelefono = be.Telefono1;
                                    strLocalCelular = be.Telefono3;
                                    strLocalFax = be.Fax;
                                    break;
                                case "N": //Nacimiento
                                    nNacimientoIdPais = be.IdPais;
                                    nNacimientoIdDepartamento = be.IdDepartamento;
                                    nNacimientoIdProvincia = be.IdProvincia;
                                    strLugarNacimiento = be.Direccion;
                                    break;
                                case "E"://Domicilio Extranjero
                                    nExtranjeroIdPais = be.IdPais;
                                    nExtranjeroIdDepartamento = be.IdDepartamento;
                                    nExtranjeroProvincia = be.IdProvincia;
                                    strExtranjeroTelefono = be.Telefono1;
                                    strExtranjeroCelular = be.Telefono3;
                                    strExtranjeroDireccion = be.Direccion;
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                    if (beEmpleado.TransaccionSpring == "S")
                    {
                        //Actualizar Persona en Spring
                        pbe.Persona.IdPersona = beRe.IdSpring;
                        pbe.Persona.DescripcionDireccion = strLocalDireccion;
                        pbe.Persona.DireccionReferencia = strLocalDireccionReferencia;
                        pbe.Persona.IdDepartamento = nLocalIdDepartamento;
                        pbe.Persona.IdProvincia = nLocalIdProvincia;
                        pbe.Persona.Telefono1 = strLocalTelefono;
                        pbe.Persona.Celular1 = strLocalCelular;
                        pbe.Persona.Fax = strLocalFax;

                        pbe.Persona.IdPaisNacimiento = nNacimientoIdPais;
                        pbe.Persona.IdDepartamentoNacimiento = nNacimientoIdDepartamento;
                        pbe.Persona.IdProvinciaNacimiento = nNacimientoIdProvincia;
                        pbe.Persona.LugarNacimiento = strLugarNacimiento;

                        pbe.Persona.IdPaisExtranjero = nExtranjeroIdPais;
                        pbe.Persona.IdDepartamentoExtranjera = nExtranjeroIdDepartamento;
                        pbe.Persona.IdProvinciaExtranjero = nExtranjeroProvincia;
                        pbe.Persona.DireccionExtranjero = strExtranjeroDireccion;
                        pbe.Persona.TelefonoExtranjero = strExtranjeroTelefono;
                        pbe.Persona.CelularExtranjero = strExtranjeroCelular;

                        _dlPersona.ActualizarSpring(pbe.Persona);
                    }

                    //Actualizar Empleado Insifo.
                    _dlEmpleado.Actualizar(pbe);
                    if (beEmpleado.TransaccionSpring == "S")
                    {
                        //Actualizar Empleado de Spring
                        pbe.IdEmpleado = beRe.IdSpring;
                        _dlEmpleado.ActualizarSpring(pbe);
                        //Actualizar HR_Empleado
                        _dlEmpleado.ActualizarHREmpleadoSpring(pbe);
                    }
                }
                else
                {
                    //Asignar el posible error
                    beEmpleado.Error = beRe.Error;
                    beEmpleado.Mensaje = beRe.Mensaje;
                }
                //Termina la transacción.
                _transaccion.Commit();

            }
            catch (Exception e)
            {
                //Cancela la transaccion
                _transaccion.RollBack();
                throw e;
            }
            finally
            {
                _transaccion.Dispose();
            }
            return beEmpleado;
        }

        /// <summary>
        /// Método que elimina logicamente un objeto
        /// </summary>
        /// <returns>Devuelve un Objeto</returns>
        public BEEmpleado Eliminar(BEEmpleado pbe)
        {
            BEEmpleado oBe = new BEEmpleado();
            _transaccion = DLTransactionMng.Begin();
            try
            {
                _dlEmpleado.Transaction = _transaccion;

                oBe = _dlEmpleado.Eliminar(pbe);

                if (oBe.TransaccionSpring == "S")
                {
                    //-Eliminar del Spring
                    pbe.IdEmpleado = pbe.IdSpring;
                    _dlEmpleado.EliminarSpring(pbe);
                }
                //Culmina la transaccion
                _transaccion.Commit();
            }
            catch (Exception e)
            {
                //Cancela la transaccion
                _transaccion.RollBack();
                throw e;
            }
            finally
            {
                _transaccion.Dispose();
            }
            return oBe;
        }

    }

}
